import java.util.Map;

/**
 * 加减法口算练习系统 V1.0 - 面向对象版本
 * 基于Expression类和ExerciseSet类的完整实现
 * 
 * @author System Designer
 * @version 1.0
 */
public class CalculationSystemV10 {
    
    /**
     * 主程序入口
     */
    public static void main(String[] args) {
        System.out.println("===== 加减法口算练习系统 V1.0（面向对象版本）=====");
        System.out.println("设计特点：");
        System.out.println("1. 封装了算式类（Expression）和习题类（ExerciseSet）");
        System.out.println("2. 支持生成无重复的加减法算式");
        System.out.println("3. 确保加法和减法都有一定比例");
        System.out.println("4. 加法结果不超过100，减法差不小于0");
        System.out.println("5. 支持负数运算和超过100的数值");
        System.out.println("6. 格式化显示，每行3个算式");
        System.out.println();
        
        // 创建习题集，生成50道题
        ExerciseSet exerciseSet = new ExerciseSet(50);
        exerciseSet.generateExercises();
        
        // 显示统计信息
        displayStatistics(exerciseSet);
        
        System.out.println("\n===== 练习题目 =====");
        System.out.println("请认真完成以下" + exerciseSet.getTotalCount() + "道题目：\n");
        
        // 格式化显示所有题目
        exerciseSet.displayFormatted();
        
        System.out.println("\n===== 练习结束 =====");
        System.out.println("恭喜您完成了本次练习！");
        
        // 演示类的其他功能
        demonstrateFeatures(exerciseSet);
    }
    
    /**
     * 显示统计信息
     */
    private static void displayStatistics(ExerciseSet exerciseSet) {
        System.out.println("===== 统计信息 =====");
        System.out.println("总题目数: " + exerciseSet.getTotalCount());
        System.out.println("加法题目: " + exerciseSet.getAdditionCount() + " 道");
        System.out.println("减法题目: " + exerciseSet.getSubtractionCount() + " 道");
        
        Map<String, Integer> stats = exerciseSet.calculateStatistics();
        System.out.println("加法比例: " + stats.get("additionRatio") + "%");
        System.out.println("有效算式: " + stats.get("valid") + " 道");
        System.out.println("无效算式: " + stats.get("invalid") + " 道");
        System.out.println();
    }
    
    /**
     * 演示类的各种功能
     */
    private static void demonstrateFeatures(ExerciseSet exerciseSet) {
        System.out.println("===== 功能演示 =====");
        
        // 演示1: 手动添加算式
        System.out.println("1. 手动添加算式演示:");
        ExerciseSet manualSet = new ExerciseSet();
        
        Expression exp1 = new Expression(25, '+', 35);
        Expression exp2 = new Expression(80, '-', 20);
        Expression exp3 = new Expression(-10, '+', 15);
        
        manualSet.addExpression(exp1);
        manualSet.addExpression(exp2);
        manualSet.addExpression(exp3);
        
        System.out.println("   手动添加了3道题:");
        manualSet.display();
        
        // 演示2: 算式类的方法
        System.out.println("\n2. 算式类方法演示:");
        Expression demoExp = new Expression(45, '+', 30);
        System.out.println("   算式: " + demoExp.formatExpression());
        System.out.println("   含答案: " + demoExp.formatWithAnswer());
        System.out.println("   是否加法: " + demoExp.isAddition());
        System.out.println("   是否有效: " + demoExp.isValid());
        System.out.println("   操作数1: " + demoExp.getNum1());
        System.out.println("   操作数2: " + demoExp.getNum2());
        System.out.println("   结果: " + demoExp.getResult());
        
        // 演示3: 修改算式
        System.out.println("\n3. 修改算式演示:");
        System.out.println("   修改前: " + demoExp.toString());
        demoExp.setNum1(60);
        demoExp.setOperator('-');
        demoExp.setNum2(25);
        System.out.println("   修改后: " + demoExp.toString());
        
        // 演示4: 算式比较
        System.out.println("\n4. 算式比较演示:");
        Expression expA = new Expression(30, '+', 20);
        Expression expB = new Expression(30, '+', 20);
        Expression expC = new Expression(25, '+', 25);
        
        System.out.println("   算式A: " + expA.toString());
        System.out.println("   算式B: " + expB.toString());
        System.out.println("   算式C: " + expC.toString());
        System.out.println("   A与B相等: " + expA.equals(expB));
        System.out.println("   A与C相等: " + expA.equals(expC));
        
        System.out.println("\n===== 演示完成 =====");
    }
}